/**
 * @file signal_event.h
 * @brief signal类定义，用于线程间同步，定频设置
 * @details 封装std::condition_variable实现线程间同步。提供创建，休眠，唤醒等接口
 * @author yupeijin
 * @date 2022年10月13日
 * @license MIT Apache2.0
 * Copyright (C), 2010-2022 Jouav Co., Ltd.
 */

#pragma once

#include <memory>
#include <mutex>  
#include <condition_variable>
namespace jouav
{
class SignalEvent {
public:
	typedef std::shared_ptr<SignalEvent> Ptr;

	/**
	* @brief 创建事件对象
	* @return 返回智能指针对象
	*/
	static SignalEvent::Ptr CreateSignalEvent();
	SignalEvent();
	virtual ~SignalEvent();

	/**
	* @brief 线程阻塞，等待信号
	* @return 
	*/  
	virtual void WaitSignal();

	/**
	* @brief 触发信号，唤醒阻塞的线程
	* @param tiemout_ms 超时时间
	* @return 0:被唤醒，1：超时唤醒 -1：失败
	*/
	virtual int WaitSignal(const int64_t& tiemout_ms);

	/**
	* @brief 触发信号，唤醒阻塞的线程
	* @return 
	*/ 
	virtual void TriggerSignal();
private:
	std::mutex m_mtx = {};
	std::condition_variable m_cv = {};
};
} //namespace jouav
